package cn.lf.android.lawfirm.http.manager;

import android.util.Log;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import cn.lf.android.lawfirm.MyApplication;
import cn.lf.android.lawfirm.utils.DebugLog;
import cn.yzl.okhttputils.okhttp.callback.Callback;
import okhttp3.Call;
import okhttp3.Response;

/**
 * @author zby
 * @version create time：2016-8-11 下午6:10:51
 *          负责对Session失效等全局事件进行拦截
 *          只有网络请求实现此回调才会起作用
 */
public abstract class EBCallback extends Callback<String> {

    /**
     * 因为session失效 需要自动请求的队列
     * 只针对requestAgain=true的请求
     */
    public static List<EBCallback> AUTO_REQUEST_QUEUE_BY_SESSION = new ArrayList<EBCallback>();

    /**
     * 是否已经在发送 重新登录请求
     * 以下方法改变了该值
     */
    public static boolean ALREADY_REQUEST_LOGIN = false;


    public EBCallback() {
    }

    public EBCallback(boolean requestAgain) {
        super(requestAgain);
    }

    @Override
    public String parseNetworkResponse(Response response) throws Exception {
        return response.body().string();
    }

    @SuppressWarnings("static-access")
    @Override
    public void onResponse(String response) {
        if (response != null) {
            try {
                Log.e("", "response=详情0=" + response);
                JSONObject object = new JSONObject(response);
                String status = object.optString("status");
                //需要的拦截操作
//                if ("700".equals(status)) {//session失效需要重新登录
//                    if (!AccessManager.getInstance().getmUser().isTaste()) {
//                        if (isRequestAgain()) {
//                            MyApplication.getInstance().goToLogin(this);
//                        }else{
//                            MyApplication.getInstance().goToLogin(null);
//                        }
//                    } else {
//                        MyApplication.getInstance().getmCurrentActivity().showOutToase("登录失效\n请重新登录");
//                    }
//                    return;
//                } else if ("10031".equals(status)) {//您所登录的账号已超出服务期限，请联系客服续费后使用
//                    MyApplication.getInstance().getmCurrentActivity().showOutdateDialog("您所登录的账号已超出服务期限\n请联系客服续费后使用");
//                    return;
//                } else if ("10032".equals(status)) {//您所登录的账号已在其它设备登录，请重新输入信息登录
//                    MyApplication.getInstance().getmCurrentActivity().showOutToase("您所登录的账号已在其它设备登录\n请重新输入信息登录");
//                    return;
//                } else if ("10033".equals(status)) {//您所登录的账号已被删除，请重新输入信息登录
//                    MyApplication.getInstance().getmCurrentActivity().showOutToase("您所登录的账号已被删除\n请重新输入信息登录");
//                    return;
//                } else if ("24444".equals(status)) {//无操作权限
//                    MyApplication.getInstance().getmCurrentActivity().showOutToase("权限变更\n请重新登录");
//                    return;
//                } else if ("24445".equals(status)) {//您的权限被超级管理员变更，请重新登录后使用
//                    MyApplication.getInstance().getmCurrentActivity().showOutToase("权限变更\n请重新登录");
//                    return;
//                } else if ("24450".equals(status)) {//当前版本功能发生变更,请重新登录后使用
//                    MyApplication.getInstance().getmCurrentActivity().showChangeDialog("当前版本功能发生变更\n请重新登录后使用");
//                    return;
//                }

                onEBResponse(response);


            } catch (JSONException e) {
                e.printStackTrace();
                onEBError(e.getMessage());
            }
        }

    }

    @Override
    public void onError(Call call, int code, Exception e) {
        DebugLog.e("code==" + code);
        if (code == 401 && isRequestAgain()) {
            if (ALREADY_REQUEST_LOGIN) {

            } else {
                ALREADY_REQUEST_LOGIN = true;
                MyApplication.getmCurrentActivity().reLogin();
            }
            AUTO_REQUEST_QUEUE_BY_SESSION.add(this);
        } else {
            Log.e("", "response=错0=" + e.getMessage());
            onEBError(e.getMessage());
        }
    }

    public abstract void onEBResponse(String response);

    public abstract void onEBError(String errorMsg);

//    /**
//     * Session失效，通知请求的接口相应的变化
//     * 不强制实现该接口，根据需要进行自主覆盖
//     * 注意该方法是在发起异步重新登录之前
//     */
//    public void onReLogin() {
//
//    }

    public static void reCallBySession() {
        Iterator<EBCallback> iterator = AUTO_REQUEST_QUEUE_BY_SESSION.iterator();
        while (iterator.hasNext()) {
            EBCallback next = iterator.next();
            next.callSelf();
            iterator.remove();
        }

    }

}
